package com.note.feng.juc.mutithread;

/**
 * @author yuhf
 */
public class JoinDemo {

    /**
     * 睡眠时长
     */
    public static final int SLEEP_GAP = 500000;

    static class SleepThread extends Thread{
        static int threadSeqNumber = 1;

        public SleepThread(){
            super("sleepThred-" + threadSeqNumber);
            threadSeqNumber ++;
        }
        public void run(){
            try{
                System.out.println(getName() + " 进入睡眠。");
                Thread.sleep(SLEEP_GAP);
            }catch (InterruptedException e){
                System.out.println(getName() + " 发生异常被打断");
            }
            System.out.println(getName() + " 运行结束。");
        }
    }

    /**
     * join() 方法用于等待一个线程的终止。
     * 当在一个线程中调用另一个线程的 join() 方法时，当前线程将会被阻塞，直到被调用的线程执行完毕.
     *
     * 带有超时时间参数的 join(long millis) 方法。
     * 这个参数表示等待被调用的线程执行完毕的最长时间（以毫秒为单位）。
     * 如果在超时时间内被调用的线程没有执行完毕，那么 join() 方法将会返回
     */
    public static void main(String[] args) {
        Thread thread1 = new SleepThread();
        System.out.println("启动thread1.");
        thread1.start();
        try {
            thread1.join(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("启动thread2.");
        //启动第二条线程，并且进行限时合并，等待时间为1秒
        Thread thread2 = new SleepThread();
        thread2.start();
        try {
            thread2.join(); //限时合并，限时1秒
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("线程运行结束.");
    }
}
